package cn.com.nes.site.service.inventory.impl;

import cn.com.nes.common.exception.BusinessException;
import cn.com.nes.mybatis.agent.inventory.entity.GoodsType;
import cn.com.nes.mybatis.agent.inventory.mapper.GoodsTypeMapper;
import cn.com.nes.site.entity.bo.inventory.HasGoodsTypeBo;
import cn.com.nes.site.entity.em.DeleteEnum;
import cn.com.nes.site.entity.vo.inventory.SaveGoodsTypeVo;
import cn.com.nes.site.service.inventory.BusinessGoodsTypeService;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

@Slf4j
@Service
public class BusinessGoodsTypeServiceImpl extends ServiceImpl<GoodsTypeMapper, GoodsType> implements BusinessGoodsTypeService {

    @Resource
    private GoodsTypeMapper goodsTypeMapper;

    @Transactional(rollbackFor = Exception.class)
    @Override
    public boolean saveGoodsType(SaveGoodsTypeVo vo) throws Exception {
        if (hasGoodsType(vo.toHasGoodsTypeBo())) {
            throw new BusinessException("该货品类别已存在!");
        }

        boolean isAdd = false;
        if (StrUtil.isEmpty(vo.getGoodsTypeId())) {
            isAdd = true;
        }
        GoodsType goodsType = null;
        if (isAdd) {
            goodsType = new GoodsType();
            goodsType.setGoodsTypeId(getNextGoodsTypeId(vo.getGoodsTypePid(), vo.getOperateUserCompanyId()));
            goodsType.setGoodsTypeName(vo.getGoodsTypeName());
            goodsType.setPGoodsTypeId(vo.getGoodsTypePid());
            goodsType.setPGoodsTypeName(vo.getGoodsTypePname());
            goodsType.setGoodsTypeType(vo.getGoodsTypeType());
            goodsType.setMemo(vo.getMemo());
            goodsType.setCompanyId(vo.getOperateUserCompanyId());
            goodsType.setCreateUid(vo.getOperateUserId());
            goodsType.setCreateTime(vo.getOperateDate());
            goodsType.setDeleted(DeleteEnum._0.getKey());
        } else {
            goodsType = this.baseMapper.getByGoodsTypeId(vo.getGoodsTypeId(), vo.getOperateUserCompanyId());
            goodsType.setGoodsTypeName(vo.getGoodsTypeName());
            goodsType.setMemo(vo.getMemo());
            goodsType.setGoodsTypeType(vo.getGoodsTypeType());
            goodsType.setModifyTime(vo.getOperateDate());
            goodsType.setModifyUid(vo.getOperateUserId());
        }
        return this.saveOrUpdate(goodsType);
    }

    private String getNextGoodsTypeId(String pGoodsTypeId, String companyId) {
        String newGoodsTypeId = "";
        String goodsTypeId = goodsTypeMapper.getMaxGoodsTypeId(pGoodsTypeId, companyId);
        if (StrUtil.isEmpty(goodsTypeId)) {
            goodsTypeId = "0000";
        }
        newGoodsTypeId = goodsTypeId.length() > 4 ? goodsTypeId.substring(goodsTypeId.length() - 4) : goodsTypeId;
        int nextId = Integer.parseInt(newGoodsTypeId) + 1;
        newGoodsTypeId = String.format("%04d", nextId);
        if (!"0000".equals(pGoodsTypeId)) {
            newGoodsTypeId = pGoodsTypeId + newGoodsTypeId;
        }
        return newGoodsTypeId;
    }

    private boolean hasGoodsType(HasGoodsTypeBo bo) {
        return goodsTypeMapper.hasGoodsType(bo);
    }

}
